/**
 * @Copyright ®2015 Sinosoft Co. Ltd. All rights reserved.<br/>
 * 项目名称 : 支付平台
 * 创建日期 : 2016年5月27日
 * 修改历史 : 
 *     1. [2016年5月27日]创建文件 by chihouliang
 */
package com.sinosoft.sinopay.apiservice.wechat.dto;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import com.sinosoft.sinocloud.platform.base.SinoBaseDTO;
import com.sinosoft.sinopay.apiservice.wechat.util.RandomStringUtil;
import com.sinosoft.sinopay.apiservice.wechat.util.SignatureUtil;
import com.sinosoft.sinopay.apiservice.wechat.util.WechatConfig;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver;

/**
 * 【公众号支付统一下单参数Dto】
 * 
 * @Description: 公众号支付统一下单参数Dto
 * @author chihouliang
 * @date 2016年5月27日 下午4:00:10
 * @version V1.0
 */
@SuppressWarnings("serial")
@XStreamAlias("xml")
public class JsApiPayParaDto extends SinoBaseDTO {
    /**公众账号ID*/
    private String appid;
    /**商户号*/
    private String mch_id;
    /**设备号*/
    private String device_info;
    /**随机字符串*/
    private String nonce_str;
    /**签名*/
    private String sign;
    /**商品描述*/
    private String body;
    /**商户订单号*/
    private String out_trade_no;
    /**货币类型*/
    private String fee_type;
    /**总金额*/
    private int total_fee = 0;
    /**终端IP*/
    private String spbill_create_ip;
    /**通知地址*/
    private String notify_url;
    /**交易类型*/
    private String trade_type;
    private String openid; 
    /**传输的报文*/
    private String xml;

    public JsApiPayParaDto(String body, String outTradeNo, int totalFee, String spBillCreateIP, String notifyUrl, String openid) {
        //微信分配的公众号ID（开通公众号之后可以获取到）
        this.setAppid(WechatConfig.getProperty("wechat.appid"));
        //微信支付分配的商户号ID（开通公众号的微信支付功能之后可以获取到）
        this.setMch_id(WechatConfig.getProperty("wechat.mch_id"));
        //设备号，公共号和网页传WEB
        this.setDevice_info("WEB");

        //要支付的商品的描述信息，用户会在支付成功页面里看到这个信息
        this.setBody(body);
        //商户系统内部的订单号,32个字符内可包含字母, 确保在商户系统唯一
        this.setOut_trade_no(outTradeNo);
        this.setFee_type("CNY");//货币类型，只支持人民币CNY
        //订单总金额，单位为“分”，只能整数
        this.setTotal_fee(totalFee);
        //订单生成的机器IP
        this.setSpbill_create_ip(spBillCreateIP);
        //随机字符串，不长于32 位
        this.setNonce_str(RandomStringUtil.getRandomString32());
        //交易类型,取值如下：JSAPI，NATIVE，APP，
        this.setTrade_type("JSAPI");
        //通知地址,接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
        this.setNotify_url(notifyUrl);
        //商品ID,trade_type=NATIVE，此参数必传。此id为二维码中包含的商品ID，商户自行定义。
        //		this.setProduct_id("");
        //用户标识,trade_type=JSAPI，此参数必传，用户在商户appid下的唯一标识。
        this.setOpenid(openid);

        //签名：根据API给的签名规则进行签名
        String key = WechatConfig.getProperty("wechat.key");
        String sign = SignatureUtil.getSign(toMap(), key);
        setSign(sign);//把签名数据设置到Sign这个属性中
        //生成报文：xml
        this.createXml();
    }

    //生成报文
    private void createXml() {
        XStream xStream = new XStream(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
        xStream.processAnnotations(this.getClass());
        String str = xStream.toXML(this);
        this.setXml(str);
    }

    /**
     * @param xml the xml to set
     */
    public void setXml(String xml) {
        this.xml = xml;
    }

    /**
     * @return the appid
     */
    public String getAppid() {
        return appid;
    }

    /**
     * @param appid the appid to set
     */
    public void setAppid(String appid) {
        this.appid = appid;
    }

    /**
     * @return the xml
     */
    public String getXml() {
        return xml;
    }

    /**
     * @return the fee_type
     */
    public String getFee_type() {
        return fee_type;
    }

    /**
     * @param fee_type the fee_type to set
     */
    public void setFee_type(String fee_type) {
        this.fee_type = fee_type;
    }

    /**
     * @return the mch_id
     */
    public String getMch_id() {
        return mch_id;
    }

    /**
     * @param mch_id the mch_id to set
     */
    public void setMch_id(String mch_id) {
        this.mch_id = mch_id;
    }

    /**
     * @return the device_info
     */
    public String getDevice_info() {
        return device_info;
    }

    /**
     * @param device_info the device_info to set
     */
    public void setDevice_info(String device_info) {
        this.device_info = device_info;
    }

    /**
     * @return the nonce_str
     */
    public String getNonce_str() {
        return nonce_str;
    }

    /**
     * @param nonce_str the nonce_str to set
     */
    public void setNonce_str(String nonce_str) {
        this.nonce_str = nonce_str;
    }

    /**
     * @return the sign
     */
    public String getSign() {
        return sign;
    }

    /**
     * @param sign the sign to set
     */
    public void setSign(String sign) {
        this.sign = sign;
    }

    /**
     * @return the body
     */
    public String getBody() {
        return body;
    }

    /**
     * @param body the body to set
     */
    public void setBody(String body) {
        this.body = body;
    }

    /**
     * @return the out_trade_no
     */
    public String getOut_trade_no() {
        return out_trade_no;
    }

    /**
     * @param out_trade_no the out_trade_no to set
     */
    public void setOut_trade_no(String out_trade_no) {
        this.out_trade_no = out_trade_no;
    }

    /**
     * @return the total_fee
     */
    public int getTotal_fee() {
        return total_fee;
    }

    /**
     * @param total_fee the total_fee to set
     */
    public void setTotal_fee(int total_fee) {
        this.total_fee = total_fee;
    }

    /**
     * @return the spbill_create_ip
     */
    public String getSpbill_create_ip() {
        return spbill_create_ip;
    }

    /**
     * @param spbill_create_ip the spbill_create_ip to set
     */
    public void setSpbill_create_ip(String spbill_create_ip) {
        this.spbill_create_ip = spbill_create_ip;
    }

    /**
     * @return the notify_url
     */
    public String getNotify_url() {
        return notify_url;
    }

    /**
     * @param notify_url the notify_url to set
     */
    public void setNotify_url(String notify_url) {
        this.notify_url = notify_url;
    }

    /**
     * @return the trade_type
     */
    public String getTrade_type() {
        return trade_type;
    }

    /**
     * @param trade_type the trade_type to set
     */
    public void setTrade_type(String trade_type) {
        this.trade_type = trade_type;
    }

    /**
     * @return the openid
     */
    public String getOpenid() {
        return openid;
    }

    /**
     * @param openid the openid to set
     */
    public void setOpenid(String openid) {
        this.openid = openid;
    }

    /**
     * 
     * 把对象转换成map对象
     * @Title: toMap 
     * @Description: 把对象转换成map对象
     * @return
     */
    public Map<String, Object> toMap() {
        Map<String, Object> map = new HashMap<String, Object>();
        Field[] fields = this.getClass().getDeclaredFields();
        for (Field field : fields) {
            Object obj;
            try {
                obj = field.get(this);
                if (obj != null) {
                    map.put(field.getName(), obj);
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return map;
    }
}
